home *** CD-ROM | disk | FTP | other *** search
- /*
- File: BigBrother.c
-
- Contains: A Conferencing server with trivial security
-
- Written by: Guy Riddle
-
- Copyright: © 1994 by Apple Computer, Inc., all rights reserved.
-
- */
-
- #include <Types.h>
- #include <QuickDraw.h>
- #include <Fonts.h>
- #include <Events.h>
- #include <Windows.h>
- #include <Menus.h>
- #include <Dialogs.h>
- #include <Desk.h>
- #include <ToolUtils.h>
- #include <Memory.h>
- #include <SegLoad.h>
- #include <Files.h>
- #include <Folders.h>
- #include <OSUtils.h>
- #include <DiskInit.h>
- #include <Scrap.h>
-
- #include <String.h>
- #include <Strings.h>
- #include <stdio.h>
-
- #include <QuickTimeConferencing.h>
-
- #include "See.h"
-
- typedef EventRecord *EventRecordPtr;
- typedef Byte *BytePtr;
-
- #define MAXMEMBERS 0
-
- typedef struct {
- Rect box;
- MTConferenceMember member;
- MTControllerComponent controller;
- } Member, *MemberPtr;
-
- #define WRECT(top, left) (top),(left),(top+120),(left+160)
-
- Member gMember[MAXMEMBERS+1] = {
- { WRECT(100, 100) },
- };
-
- #define PW_CLEAR 'pw-C'
-
- MTCapabilitiesList gCapabilities = { 1, { PW_CLEAR, 1, mtMessageRequiredCapability } };
-
- MTCString63 gUserName, gPassword;
-
- ComponentInstance gCC;
- MTConferenceToken gConference;
-
- void Initialize(void);
- Boolean Configure(void);
- void EnableButton(DialogRef, short, Boolean);
- void GetValue(BytePtr, DialogRef, short);
- void StartMovieTalk(void);
- void StopMovieTalk(void);
- void EventLoop(void);
-
- void DoToolboxEvent(EventRecordPtr);
- void DoKeyDownEvent(EventRecordPtr);
- void DoMouseDownEvent(EventRecordPtr);
- void DoDiskEvent(EventRecordPtr);
- void DoMenuBar(long);
- void DoAppleMenu(short);
- void DoFileMenu(short);
-
- void DoConferenceEvent(MTConferenceEventPtr);
- void DoConfReady(MTConferenceEventPtr);
- void DoMemberReady(MTConferenceEventPtr);
- void DoMessageArrived(MTConferenceEventPtr);
- void DoConfTerminated(MTConferenceEventPtr);
- void DoIncomingCall(MTConferenceEventPtr);
-
- void Sorry(int, int, MTConferenceMember, OSErr);
-
- /*
- * Seerver
- *
- * This is a Server-only version of conferencing -- it doesn't place calls.
- *
- * • You can configure the name, service type, and optional password
- * for access
- *
- * • As a server, it needs no recording or snapshot support
- *
- * • The password protocol illustrates MessageCapabilities and sending
- * user messages
- *
- * • MTConferenceSetMode is used to indicate it doesn't want to receive data
- *
- * • MTConferenceDetachMember is used to reduce memory overhead when multicast
- * channels are available
- */
-
- void main()
- {
- Initialize();
-
- if(Configure()){
- StartMovieTalk();
- EventLoop();
- }
- }
-
- void
- Initialize(
- void
- ){
- Handle menuBar;
-
- InitGraf((Ptr) &qd.thePort);
- InitFonts();
- InitWindows();
- InitMenus();
- TEInit();
- InitDialogs(nil);
- InitCursor();
-
- menuBar = GetNewMBar(rBigBroMenuBar);
-
- SetMenuBar(menuBar);
- DisposHandle(menuBar);
- AddResMenu(GetMHandle(mApple), 'DRVR');
-
- DrawMenuBar();
- }
-
- Boolean
- Configure(
- void
- ){
- DialogRef dp;
- short itemHit;
-
- dp = GetNewDialog(rConfigure, 0, (WindowRef) -1);
- SetDialogCancelItem(dp, diCancel);
- SetDialogDefaultItem(dp, diOK);
- SetDialogTracksCursor(dp, true);
- PostEvent(keyDown, '\b'); // ick
-
- do{
- EnableButton(dp, diOK, gUserName[0]);
-
- ModalDialog(0, &itemHit);
-
- GetValue(gUserName, dp, diName);
- GetValue(gPassword, dp, diPassword);
- }while(itemHit > diCancel);
-
- DisposeDialog(dp);
- InitCursor();
-
- return(itemHit == diOK);
- }
-
- void
- EnableButton(
- DialogRef dp,
- short item,
- Boolean enabled
- ){
- Handle ih;
- Rect rect;
- short type;
-
- GetDialogItem(dp, item, &type, &ih, &rect);
-
- if(enabled)
- type &= ~itemDisable;
- else
- type |= itemDisable;
-
- HiliteControl((ControlHandle) ih, enabled ? 0 : 255);
-
- SetDialogItem(dp, item, type, ih, &rect);
-
- SetPort(dp);
- InsetRect(&rect, -5, -5);
- InvalRect(&rect);
- }
-
- void
- GetValue(
- BytePtr p,
- DialogRef dp,
- short item
- ){
- Handle ih;
- Rect rect;
- short type;
-
- GetDialogItem(dp, item, &type, &ih, &rect);
- GetDialogItemText(ih, p);
-
- if(p[0] && p[p[0]] < ' '){
- p[0]--; // strip CR or other junk
- SetDialogItemText(ih, p);
- }
-
- p2cstr(p);
- }
-
- void
- StartMovieTalk(
- void
- ){
- MTCapabilitiesHandle ch;
-
- gCC = OpenDefaultComponent(kMTConferenceType, kMTMovieTalkSubType);
-
- MTConferenceSetMode(gCC, mtSendMediaModeMask+mtShareableModeMask);
-
- gMember[0].controller = MTConferenceNewPreparedController(gCC, &gMember[0].box,
- mtMediaSourcePrepMask+mtGrabVideoPrepMask+mtGrabAudioPrepMask+mtWindowVisiblePrepMask+mtControllerVisiblePrepMask,
- gUserName);
-
- MTDirectorSetSoundThreshold(MTControllerGetStreamDirector(gMember[0].controller), kMTAllStreams, 0); // rather not have VOX
-
- if(gPassword[0]){
- PtrToHand((Ptr) &gCapabilities, (Handle *) &ch, sizeof(gCapabilities));
- MTConferenceSetMessageCapabilities(gCC, ch);
- }
-
- MTConferenceListen(gCC, gUserName, gUserName, (MTCString)"mtlkatlk\tMulticaster\x0Dmtlktcpi\t545\x0Dmtlkisdn\t-\x0D");
- }
-
- void
- EventLoop(
- void
- ){
- EventRecord tEvent;
- MTConferenceEvent cEvent;
-
- for(;;){
- if(MTConferenceGetNextEvent(gCC, &cEvent))
- DoConferenceEvent(&cEvent);
-
- if(WaitNextEvent(everyEvent, &tEvent, 1, 0))
- DoToolboxEvent(&tEvent);
- }
- }
-
- void
- DoToolboxEvent(
- EventRecordPtr ev
- ){
- switch(ev->what) {
- case mouseDown:
- DoMouseDownEvent(ev);
- break;
-
- case keyDown:
- DoKeyDownEvent(ev);
- break;
-
- case diskEvt:
- DoDiskEvent(ev);
- }
- }
-
- void
- DoMouseDownEvent(
- EventRecordPtr ev
- ){
- WindowPtr wp;
- short part;
-
- part = FindWindow(ev->where, &wp);
-
- switch(part){
- case inMenuBar:
- DoMenuBar(MenuSelect(ev->where));
- }
- }
-
- void
- DoKeyDownEvent(
- EventRecordPtr ev
- ){
- if(ev->modifiers & cmdKey)
- DoMenuBar(MenuKey(ev->message & charCodeMask));
- }
-
- void
- DoDiskEvent(
- EventRecordPtr ev
- ){
- Point where;
-
- if(HiWord(ev->message)){
- SetPt(&where, kDILeft, kDITop);
- DIBadMount(where, ev->message);
- }
- }
-
- void
- DoMenuBar(
- long selection
- ){
- short menuID;
- short menuItem;
-
- menuID = HiWord(selection);
- menuItem = LoWord(selection);
-
- switch(menuID){
- case mApple:
- DoAppleMenu(menuItem);
- break;
-
- case mFile:
- DoFileMenu(menuItem);
- break;
-
- case mEdit: /* call SystemEdit for DA editing & MultiFinder */
- SystemEdit(menuItem-1);
- }
-
- HiliteMenu(0);
- }
-
- void
- DoAppleMenu(
- short item
- ){
- DialogRef dp;
- Str255 daName;
- short itemHit;
-
- switch(item){
- case iAbout:
- dp = GetNewDialog(rAboutAlert, nil, (WindowRef) -1);
- SetDialogDefaultItem(dp, 1);
-
- ModalDialog(0, &itemHit);
-
- DisposeDialog(dp);
- break;
-
- default: /* all non-About items in this menu are DAs */
- GetItem(GetMHandle(mApple), item, daName);
- OpenDeskAcc(daName);
- }
- }
-
- void
- DoFileMenu(
- short item
- ){
- switch(item){
- case iQuit:
- StopMovieTalk();
-
- ExitToShell();
- }
- }
-
- void
- StopMovieTalk(
- void
- ){
- CloseComponent(gCC);
- }
-
- void
- DoConferenceEvent(
- MTConferenceEventPtr ce
- ){
- switch(ce->what){
- case mtIncomingCallEvent:
- DoIncomingCall(ce);
- break;
-
- case mtConferenceReadyEvent:
- DoConfReady(ce);
- break;
-
- case mtConferenceTerminatedEvent:
- DoConfTerminated(ce);
- break;
-
- case mtMemberReadyEvent:
- DoMemberReady(ce);
- break;
-
- case mtMessageArrivedEvent:
- DoMessageArrived(ce);
- break;
-
- case mtFailedEvent:
- Sorry(701, 2, ce->who, ce->err);
- break;
- }
-
- if(ce->surprise)
- DisposeHandle(ce->surprise);
- }
-
- void
- DoIncomingCall(
- MTConferenceEventPtr ce
- ){
- if(!gPassword[0])
- MTConferenceReply(gCC, ce->who, 0);
- }
-
- void
- DoConfReady(
- MTConferenceEventPtr ce
- ){
- if(gConference)
- MTConferenceMerge(gCC, gConference, ce->who);
- else
- MTConferenceActivateConference(gCC, gConference = ce->who, gMember[0].controller);
- }
-
- void
- DoMemberReady(
- MTConferenceEventPtr ce
- ){
- MTConferenceActivateMember(gCC, ce->who, 0);
- MTConferenceDetachMember(gCC, ce->who);
- }
-
- void
- DoMessageArrived(
- MTConferenceEventPtr ce
- ){
- MTConferenceReply(gCC, ce->who, strcmp((char*)gPassword, *ce->surprise) ? afpUserNotAuth : 0);
- }
-
- void
- DoConfTerminated(
- MTConferenceEventPtr ce
- ){
- if(gConference == ce->who)
- gConference = 0;
- }
-
- void
- Sorry(
- int why,
- int note,
- MTConferenceMember who,
- OSErr err
- ){
- Str255 p1, p2, p3;
-
- GetIndString(p1, why, note);
-
- strcpy((char*)p2, (char*)MTConferenceGetMemberName(gCC, who));
- sprintf((char*)p3, "%d", err);
-
- ParamText(nil, p1, c2pstr((char*)p2), c2pstr((char*)p3));
-
- CautionAlert(why, 0);
- }